package com.rad.net.protocol.android.utils;

import java.util.ArrayList;
import java.util.HashSet;

import com.rad.net.protocol.android.encoder.EncodeValidator;
import com.rad.net.protocol.android.encoder.FieldInfo;
import com.rad.net.protocol.common.annotation.NotNull;
import com.rad.net.protocol.common.annotation.Reg;
import com.rad.net.protocol.common.cmd.BaseCmd;

/**
 * 类说明： 此类包含对{@link BaseCmd}及其子类处理的工具。除非特别注明， 否则如果指定{@link BaseCmd}引用为
 * null，则此类中的方法都会抛出 NullPointerException。
 * 
 * @author xinhui.cheng
 * @date 2014-9-18
 * @version 1.0
 */
public class CmdUtils {

	private CmdUtils() {
	}

	/**
	 * 校验指定Cmd对象的字段上是否包含{@link NotNull}、{@link Reg}
	 * 等注解，如果包含，则依据给定的内容进行相应校验，如果校验不通过则返回错误信息。
	 * 
	 * @param cmd
	 *            待校验的{@link BaseCmd}子类
	 * @return 如果全部校验成功，则返回null，如果校验不通过则返回对应的错误信息，该错误信息可以是指定的提示内容（参见
	 *         {@link NotNull}、{@link Reg}的参数），如未指定，则返回默认信息。
	 */
	public static String checkCmdField(BaseCmd cmd) {
		if (cmd == null) {
			throw new NullPointerException("cmd is null");
		}
		String message = null;
		// 过滤掉所有BaseCmd包含的字段
		ArrayList<FieldInfo> list = ClassHelper.loadClassFields(BaseCmd.class,
				null);
		HashSet<String> filterFieldNames = new HashSet<String>();
		if (list != null) {
			for (int i = 0; i < list.size(); i++) {
				filterFieldNames.add(list.get(i).getFieldName());
			}
		}
		list = ClassHelper.loadClassFields(cmd.getClass(), filterFieldNames);
		message = EncodeValidator.verifyClassFields(cmd, list);
		return message;
	}

}
